home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / UTIL / Folder・Icon・Opener 1.0.1.sit / Folder•Icon•Opener 1.0.1 / source code / sources / FIOpen.main.c < prev    next >
C/C++ Source or Header  |  1996-05-05  |  7KB  |  250 lines

  1. /*
  2.  *--------------------------------------------------------------
  3.  * FIOpen.main.c
  4.  *--------------------------------------------------------------
  5.  *    Copyright ゥ Fumio Rokkaku, 1996
  6.  *--------------------------------------------------------------
  7.  */
  8. #pragma once
  9.  
  10. /* System Headers */
  11. #include <Memory.h>
  12. #include <QuickDraw.h>
  13. #include <Events.h>
  14. #include <Windows.h>
  15. #include <Dialogs.h>
  16. #include <AppleEvents.h>
  17. #include <OSUtils.h>
  18. #include <Processes.h>
  19. #include <Files.h>
  20. #include <Aliases.h>
  21. #include <Processes.h>
  22. #include <Errors.h>
  23.  
  24. /* Project Headers */
  25. #include "FIOpen.h"
  26.  
  27. static void InitMacintoshToolbox(void);
  28. static void DoMyJob(void);
  29. static void DoMouseDown(EventRecord *);
  30. static void DoKeyDown(EventRecord *);
  31. static void DoDrag(WindowRef, Point);
  32. static void DoGoAway(WindowRef, Point);
  33. static void DoIdleTasks(void);
  34.  
  35. /*
  36.  *--------------------------------------------------------------
  37.  * global flags to determe current condition
  38.  *--------------------------------------------------------------
  39.  */
  40. Boolean    gDone;
  41. Boolean    gForeground;
  42. Boolean    gDragAndDrop;
  43. Boolean    gDoubleClick;
  44.  
  45. /*
  46.  *--------------------------------------------------------------
  47.  * main
  48.  *--------------------------------------------------------------
  49.  */
  50. void main(void)
  51. {
  52.     InitMacintoshToolbox();
  53.     GetQuickDrawVersion();
  54.  
  55.     if (SetUpMyMenus()
  56.      && SetUpMyAppleEvent()
  57.      && SetUpMyEditor()) {
  58.         DoMyJob();
  59.     }
  60. }
  61. /*
  62.  *--------------------------------------------------------------
  63.  * InitMacintoshToolbox
  64.  *--------------------------------------------------------------
  65.  *    standard intialization
  66.  *--------------------------------------------------------------
  67.  */
  68. static void InitMacintoshToolbox(void)
  69. {
  70.     int    i;
  71.  
  72.     MaxApplZone();
  73.     for (i = 0; i < 15; i++) MoreMasters();
  74.  
  75.     InitGraf(&qd.thePort);
  76.     InitFonts();
  77.     InitWindows();
  78.     InitMenus();
  79.     TEInit();
  80.     InitDialogs(0); 
  81.     InitCursor();
  82.     FlushEvents(everyEvent, 0);
  83. }
  84. /*
  85.  *--------------------------------------------------------------
  86.  * DoMyJob
  87.  *--------------------------------------------------------------
  88.  *    do my main job
  89.  *--------------------------------------------------------------
  90.  */
  91. static void DoMyJob(void)
  92. {
  93.     EventRecord    anEvent;
  94.  
  95.     gDone = false;
  96.     gForeground = true;
  97.  
  98.     do {
  99.         if (WaitNextEvent(everyEvent, &anEvent, 120, nil)) {
  100.             if (IsDialogEvent(&anEvent)) {
  101.                 DoDialogs(&anEvent);
  102.             }
  103.             else switch(anEvent.what) {
  104.             case       mouseDown:    DoMouseDown(&anEvent);    break;
  105.             case         keyDown:
  106.             case         autoKey:    DoKeyDown(&anEvent);    break;
  107.             case kHighLevelEvent:    AEProcessAppleEvent(&anEvent);    break;
  108.             }
  109.         } else {
  110.             DoIdleTasks();
  111.         }
  112.     } while (!gDone);
  113. }
  114. /*
  115.  *--------------------------------------------------------------
  116.  * DoMouseDown
  117.  *--------------------------------------------------------------
  118.  *    mouse down event handler
  119.  *--------------------------------------------------------------
  120.  */
  121. static void DoMouseDown(EventRecord *theEvent)
  122. {
  123.     WindowRef    aWindow;
  124.     short        whichPart = FindWindow(theEvent->where, &aWindow);
  125.  
  126.     switch (whichPart) {
  127.       case   inMenuBar:    DoMenus(MenuSelect(theEvent->where));    break;
  128.       case inSysWindow:    SystemClick(theEvent, aWindow);        break;
  129.       case      inDrag:    DoDrag(aWindow,   theEvent->where);    break;
  130.       case    inGoAway:    DoGoAway(aWindow, theEvent->where);    break;
  131.     }
  132. }
  133. /*
  134.  *--------------------------------------------------------------
  135.  *    DoKeyDown
  136.  *--------------------------------------------------------------
  137.  *    accept keyboard command
  138.  *--------------------------------------------------------------
  139.  */
  140. static void DoKeyDown(EventRecord *theEvent)
  141. {
  142.     int    charCode = theEvent->message & charCodeMask;
  143.     int    keyCode  = (theEvent->message & keyCodeMask) >> 8;
  144.  
  145.     if (theEvent->modifiers & cmdKey) {
  146.         DoMenus(MenuKey(charCode));
  147.     }
  148. }
  149. /*
  150.  *--------------------------------------------------------------
  151.  *    DoOSEvent
  152.  *--------------------------------------------------------------
  153.  *    suspend and resule event handling
  154.  *--------------------------------------------------------------
  155.  */
  156. void DoOSEvent(EventRecord *theEvent)
  157. {
  158.     short    messageKind = (theEvent->message >> 24) & 0xff;
  159.     short    messageFlag = theEvent->message & 0xff;
  160.  
  161.     if (messageKind == suspendResumeMessage) {
  162.         gForeground = ((messageFlag & resumeFlag) != 0);
  163.     }
  164. }
  165. /*
  166.  *--------------------------------------------------------------
  167.  * DoMountDisk
  168.  *--------------------------------------------------------------
  169.  *    disk mount check
  170.  *--------------------------------------------------------------
  171.  */
  172. void DoMountDisk(EventRecord *theEvent)
  173. {
  174.     long    diskMessage = theEvent->message;
  175.  
  176.     if (HiWord(diskMessage) != noErr) {
  177.         Point    warningPos;
  178.         warningPos.v = warningPos.h = 64;
  179.         DILoad();
  180.         DIBadMount(warningPos, diskMessage);
  181.         DIUnload();
  182.     }
  183. }
  184. /*
  185.  *--------------------------------------------------------------
  186.  * DoDrag
  187.  *--------------------------------------------------------------
  188.  *    drag any of window
  189.  *--------------------------------------------------------------
  190.  */
  191. static void DoDrag(WindowRef theWindow, Point where)
  192. {
  193.     Rect    maxRect;
  194.  
  195.     InitCursor();
  196.     if ((FrontWindow() != theWindow) && (IsKeyPressed(kCommandKey) == false)) {
  197.         SelectWindow(theWindow);
  198.     }
  199.     maxRect = (**(GetGrayRgn())).rgnBBox;
  200.     InsetRect(&maxRect, 4, 4);    /* limit draggable area */
  201.     DragWindow(theWindow, where, &maxRect);
  202. }
  203. /*
  204.  *--------------------------------------------------------------
  205.  * DoGoAway
  206.  *--------------------------------------------------------------
  207.  *    handle close box
  208.  *--------------------------------------------------------------
  209.  */
  210. static void DoGoAway(WindowRef theWindow, Point where)
  211. {
  212.     if (TrackGoAway(theWindow, where)) {
  213.         if (GetWRefCon(theWindow) == kAboutType) {
  214.             CloseAboutDialog();
  215.         }
  216.     }
  217. }
  218. /*
  219.  *--------------------------------------------------------------
  220.  * DoIdleTasks
  221.  *--------------------------------------------------------------
  222.  *    do jobs on null event
  223.  *--------------------------------------------------------------
  224.  */
  225. static void DoIdleTasks(void)
  226. {
  227.     if (gDragAndDrop && !gDoubleClick) {
  228.         /* quit when launched with drag and drop from Finder */
  229.         gDone = true;
  230.     }
  231.     else if (gForeground) {
  232.         AdjustMyMenus();
  233.         InitCursor();
  234.     }
  235. }
  236. /*
  237.  *--------------------------------------------------------------
  238.  * IsKeyPressed
  239.  *--------------------------------------------------------------
  240.  *    check if the key is pressed
  241.  *--------------------------------------------------------------
  242.  */
  243. Boolean IsKeyPressed(const unsigned short theKey)
  244. {
  245.     KeyMap    aMap;
  246.  
  247.     GetKeys(aMap);
  248.     return ((((unsigned char *)aMap)[theKey >> 3] >> (theKey & 7)) & 1);
  249. }
  250.